package com.qqt.csr.archive.batch.task.etl.transformer;

import cn.hutool.json.JSONUtil;
import com.qqt.csr.archive.assembler.MessageArchiveAssembler;
import com.qqt.csr.archive.batch.task.context.MessageArchiveTaskContext;
import com.qqt.csr.archive.entity.reader.ArtificialMessage;
import com.qqt.csr.archive.entity.reader.SmartMessage;
import com.qqt.csr.archive.entity.writer.ArchiveMessage;
import com.qqt.csr.archive.enums.ConversationType;
import com.qqt.csr.archive.enums.FlowType;
import com.qqt.csr.archive.enums.MessageType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: yang hao
 * @Date: 2024/11/20 10:20
 * @Description: 消息归档 处理器
 **/
@Slf4j
@Component
public class MessageArchiveProcessor implements ItemProcessor<MessageArchiveTaskContext, List<ArchiveMessage>> {

    /**
     * 人工客服消息转换
     * @param context {@link MessageArchiveTaskContext} 任务上下文
     */
    private void doArtificialProcess(MessageArchiveTaskContext context) {
        log.debug("开始执行人工客服消息转换, 上下文:{}", JSONUtil.toJsonStr(context));
        List<ArtificialMessage> messages = context.getArtificialMessages();
        // 人工客服消息转换为归档消息
        List<ArchiveMessage> archiveMessages = MessageArchiveAssembler.convertArchiveMessages(messages);
        // 归档消息填充账户信息
        MessageArchiveAssembler.fill(archiveMessages, context.getUserAccount(), context.getCsAccount(), ConversationType.ARTIFICIAL);
        context.setArchiveMessages(archiveMessages);
        log.debug("结束执行人工客服消息转换, 上下文:{}", JSONUtil.toJsonStr(context));
    }

    /**
     * 智能客服消息转换
     * @param context {@link MessageArchiveTaskContext} 任务上下文
     */
    private void doSmartProcess(MessageArchiveTaskContext context) {
        log.debug("开始执行智能客服消息转换, 上下文:{}", JSONUtil.toJsonStr(context));
        List<SmartMessage> messages = context.getSmartMessages();
        // 智能客服消息转换为归档消息
        List<ArchiveMessage> archiveMessages = MessageArchiveAssembler.convertSmartMessages(context.getConversation(), messages);
        // 归档消息填充账户信息
        MessageArchiveAssembler.fill(archiveMessages, context.getUserAccount(), context.getCsAccount(), ConversationType.SMART);
        // 智能客服消息做写扩散 并填充消息流向flow字段
        List<ArchiveMessage> writeDiffusionMessage = archiveMessages.stream()
                .map(ArchiveMessage::clone)
                .filter(message -> !MessageType.SystemElem.equals(message.getType()))
                .peek(message -> {
                    message.setFlow(FlowType.OUT);
                    message.setRecipient(message.getSender());
                }).toList();
        archiveMessages.addAll(writeDiffusionMessage);
        archiveMessages = archiveMessages.stream()
                .sorted(Comparator.comparing(ArchiveMessage::getSeq))
                .collect(Collectors.toList());
        context.setArchiveMessages(archiveMessages);
        log.debug("结束执行智能客服消息转换, 上下文:{}", JSONUtil.toJsonStr(context));
    }

    /**
     * 执行转换
     * @param context {@link MessageArchiveTaskContext} 消息任务上下文
     * @return {@link List<ArchiveMessage>} 归档消息集
     */
    @Override
    public List<ArchiveMessage> process(MessageArchiveTaskContext context) throws Exception {
        // 根据来源类型进行转换
        switch (context.getSource()) {
            // 人工客服会话
            case ARTIFICIAL: doArtificialProcess(context); break;
            // 智能客服会话
            case SMART: doSmartProcess(context); break;
            // 不支持的来源类型
            default: throw new IllegalArgumentException("不支持的来源类型" + context.getSource());
        }
        return context.getArchiveMessages();
    }
}
